﻿using AutoUpdaterDotNET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace XChipTool
{
    public class AutoUpdatorHelper
    {
        public delegate void SendAutoUpEvent(bool isBool);
        public static event SendAutoUpEvent AutoUpEvent;
        /// <summary>
        /// 自动更新
        /// </summary>
        /// <param name="serverPath"></param>
        /// <param name="synchronizeInvoke"></param>
        public static void Start(string serverPath , bool isbool = false)
        {
            // 创建并配置定时器  
            //System.Timers.Timer timer = new System.Timers.Timer
            //{
            //    Interval = 60 * 1000, // 60秒  
            //                          // 注意：WPF 中通常不需要 SynchronizingObject，因为它不直接处理 UI 控件  
            //                          // 如果你需要更新 UI，你应该在 WPF 的 Dispatcher 中执行这些操作  
            //    AutoReset = true, // 设置为 true 使定时器重复触发  
            //    Enabled = true // 可以在构造函数后直接启动定时器  
            //};

            //// 定时器触发的事件处理  
            //timer.Elapsed += (sender, e) =>
            //{
            //    // 获取当前程序集的版本  
            //    // 调用 AutoUpdater.Start 方法来检查更新  
            //    // 注意：这里我假设 AutoUpdater.Start 接收版本号和服务器路径  
            //    // 你需要根据实际的 AutoUpdater.Start 方法签名进行调整  
            //    // AutoUpdater.Start(serverPath, currentVersion);  

            //    // 如果你没有直接接收版本号的 AutoUpdater.Start 方法，  
            //    // 你可能需要修改 AutoUpdater 类以接受它，或者只传递服务器路径  
            //    // 并在 AutoUpdater 类内部获取当前版本  
            //    AutoUpdater.Start(serverPath, Assembly.GetEntryAssembly());

            //    // 注意：如果 AutoUpdater.Start 方法内部需要更新 UI，  
            //    // 你需要确保它在正确的线程上执行（在 WPF 中是 Dispatcher 线程）  
            //};
            AutoUpdater.Start(serverPath);
            AutoUpdater.LetUserSelectRemindLater = false;
            AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Days;
            AutoUpdater.RemindLaterAt = 1;
            //确保自动更新器显示的所有对话框始终位于最前端，可以通过以下代码将TopMost属性设置为true。
            AutoUpdater.TopMost = false;
            ////若您不想在更新表单上显示“跳过”按钮，那个么只需在上面的代码中添加以下行即可。
            AutoUpdater.ShowSkipButton = true;

            ////如果要同步检查更新，请在启动更新之前将Synchronous设置为true，如下所示。
            AutoUpdater.Synchronous = true;

            ////若你们不想在更新表单上显示“以后提醒”按钮，那个么只需在上面的代码中添加以下一行即可。
            AutoUpdater.ShowRemindLaterButton = true;

            ////如果要忽略先前设置的“以后提醒”和“跳过”设置，则可以将“强制”属性设置为true。它还将隐藏“跳过”和“稍后提醒”按钮。如果在代码中将强制设置为true，那么XML文件中的强制值将被忽略。
            AutoUpdater.Mandatory = false;
            //AutoUpdater.UpdateMode = Mode.ForcedDownload;

            //您可以通过添加以下代码来打开错误报告。如果执行此自动更新程序。NET将显示错误消息，如果没有可用的更新或无法从web服务器获取XML文件。
            AutoUpdater.ReportErrors = true;
            //
            AutoUpdater.UpdateFormSize = new System.Drawing.Size(600, 600);
            //有时在更新前需要清除旧版文件，此时可使用以下代码指定是否在提取更新文件前清空应用目录。
            AutoUpdater.ClearAppDirectory = true;
            //更改UpdateForm的图标
            // AutoUpdater.Icon =
            if (isbool)
            {
                //如果服务器xml文件的版本大于AssemblyInfo中的版本则触发CheckForUpdateEvent
                AutoUpdater.CheckForUpdateEvent += (args) =>
                {
                    if (args.Error == null)
                    {
                        //检测到有可用的更新
                        if (args.IsUpdateAvailable)
                        {
                            DialogResult dialogResult;
                            if (args.Mandatory.Value)
                            {
                                dialogResult =
                                    MessageBox.Show(
                                        $@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.点击确认开始更新", @"更新可用",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Information);

                            }
                            else
                            {
                                dialogResult =
                                    MessageBox.Show(
                                        $@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.确认要更新吗?", @"更新可用",
                                        MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Information);

                            }

                            if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK))
                            {
                                try
                                {
                                    //触发更新下载
                                    if (AutoUpdater.DownloadUpdate(args))
                                    {
                                        if (null != AutoUpEvent)
                                        {
                                            AutoUpEvent(true);
                                        }
                                    }
                                }
                                catch (Exception exception)
                                {
                                    MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (args.Error is WebException)
                        {
                            MessageBox.Show(
                                @"连接更新服务器失败,请检查网络连接.",
                                @"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        else
                        {
                            MessageBox.Show(args.Error.Message,
                                args.Error.GetType().ToString(), MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                            return;
                        }
                    }
                };
            }
           
        }
    }
}
